home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1995 June / MacFormat 25.iso / Shareware City / Developers / ICProgKit1.0 / Source / ICComponent / ICComponent.p next >
Text File  |  1994-11-27  |  7KB  |  267 lines

  1. unit ICComponent;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Components;
  7.  
  8.     function Main (var params: ComponentParameters; storage: Handle): ComponentResult;
  9.  
  10. implementation
  11.  
  12.     uses
  13. {$ifc undefined THINK_Pascal}
  14.         Types, Files, Memory, Errors, ToolUtils,
  15.         
  16.         ICTypes,
  17. {$endc}
  18.         ICRAPI, ICCAPI;
  19.  
  20.     const
  21.         kICCStart = 0;
  22.         kICCStop = 1;
  23.         kICCFindConfigFile = 2;
  24.         kICCSpecifyConfigFile = 3;
  25.         kICCGetSeed = 4;
  26.         kICCBegin = 5;
  27.         kICCGetPref = 6;
  28.         kICCSetPref = 7;
  29.         kICCCountPref = 8;
  30.         kICCGetIndPref = 9;
  31.         kICCEnd = 10;
  32.         kICCDefaultFile = 11;
  33.         kICCDeletePref = 12;
  34.         kICCGetPerm = 13;
  35.  
  36.         kICC_first_select = kICCStart;
  37.         kICC_last_select = kICCGetPerm;
  38.  
  39.     type
  40.         globalsRecord = record
  41.                 self: ComponentInstance;
  42.                 current_target: ComponentInstance;
  43.                 inst: ICRRecord;
  44.             end;
  45.         globalsPtr = ^globalsRecord;
  46.         globalsHandle = ^globalsPtr;
  47.  
  48. (* Component Manager routines *)
  49.  
  50.     function ICCICanDo (globals: globalsHandle; selector: integer): ComponentResult;
  51.     (* Handle the Component Manager CanDo request.*)
  52.     begin
  53.         case selector of
  54.             kComponentVersionSelect..kComponentOpenSelect, kComponentTargetSelect, {}
  55.             kICC_first_select..kICC_last_select: 
  56.                 ICCICanDo := 1;
  57.             otherwise
  58.                 ICCICanDo := 0;
  59.         end; (* case *)
  60.     end; (* ICCICanDo *)
  61.  
  62.     function ICCIOpen (globals: globalsHandle; self: ComponentInstance): ComponentResult;
  63.     (* Handle the Component Manager Open request, mostly delayed until ICCStart. *)
  64.         var
  65.             err: ComponentResult;
  66.     begin
  67.         (* create our globals *)
  68.         globals := globalsHandle(NewHandle(sizeof(globalsRecord)));
  69.         err := MemError;
  70.  
  71.         if err = noErr then begin
  72.             globals^^.self := self;
  73.             globals^^.current_target := self;
  74.             (* tell the Component Manager about them *)
  75.             SetComponentInstanceStorage(self, Handle(globals));
  76.         end; (* if *)
  77.  
  78.         ICCIOpen := noErr;
  79.     end; (* ICCIOpen *)
  80.  
  81.     function ICCIClose (globals: globalsHandle; self: ComponentInstance): ComponentResult;
  82.     (* Handle the Component Manager Close request. *)
  83.         var
  84.             err: ComponentResult;
  85.     begin
  86.         err := noErr;
  87.         if globals <> nil then begin
  88.             err := ICRStop(globals^^.inst);
  89.             DisposeHandle(Handle(globals));
  90.         end; (* if *)
  91.         ICCIClose := err;
  92.     end; (* ICCIClose *)
  93.  
  94.     function ICCITarget (globals: globalsHandle; new_target: ComponentInstance): ComponentResult;
  95.     (* Handle the Component Manager Target. *)
  96.         var
  97.             err: ComponentResult;
  98.     begin
  99.         globals^^.current_target := new_target;
  100.         ICCITarget := noErr;
  101.     end; (* ICCITarget *)
  102.  
  103. (* Internet Configuration specific routines *)
  104.  
  105.     function ICCIStart (globals: globalsHandle; creator: OSType): ICError;
  106.     (* Handle the start request, basically a replacement for the open because we need bonus data (creator). *)
  107.         var
  108.             err: OSErr;
  109.     begin
  110.         err := ICRStart(globals^^.inst, creator);
  111.         if err = noErr then begin
  112.             err := ICCDefaultFileName(globals^^.current_target, globals^^.inst.default_filename);
  113.         end; (* if *)
  114.         ICCIStart := err;
  115.     end; (* ICCIStart *)
  116.  
  117.     function ICCIStop (globals: globalsHandle): ICError;
  118.     begin
  119.         ICCIStop := ICRStop(globals^^.inst);
  120.     end; (* ICCIStop *)
  121.  
  122.     function ICCIFindConfigFile (globals: globalsHandle; count: integer; folders: ICDirSpecArrayPtr): ICError;
  123.     begin
  124.         ICCIFindConfigFile := ICRFindConfigFile(globals^^.inst, count, folders);
  125.     end; (* ICCIFindConfigFile *)
  126.  
  127.     function ICCISpecifyConfigFile (globals: globalsHandle; config: FSSpec): ICError;
  128.     begin
  129.         ICCISpecifyConfigFile := ICRSpecifyConfigFile(globals^^.inst, config);
  130.     end; (* ICCISpecifyConfigFile *)
  131.  
  132.     function ICCIGetSeed (globals: globalsHandle; var seed: longint): ICError;
  133.     begin
  134.         ICCIGetSeed := ICRGetSeed(globals^^.inst, seed);
  135.     end; (* ICCIGetSeed *)
  136.     
  137.     function ICCIGetPerm (globals: globalsHandle; var perm: icPerm): ICError;
  138.     begin
  139.         ICCIGetPerm := ICRGetPerm(globals^^.inst, perm);
  140.     end; (* ICCIGetPerm *)
  141.     
  142.     function ICCIBegin (globals: globalsHandle; perm: ICPerm): ICError;
  143.     begin
  144.         ICCIBegin := ICRBegin(globals^^.inst, perm);
  145.     end; (* ICCIBegin *)
  146.  
  147.     function ICCIGetPref (globals: globalsHandle; key: Str255; var attr: ICAttr; buf: Ptr; var size: longint): ICError;
  148.     begin
  149.         ICCIGetPref := ICRGetPref(globals^^.inst, key, attr, buf, size);
  150.     end; (* ICCIGetPref *)
  151.  
  152.     function ICCISetPref (globals: globalsHandle; key: Str255; attr: ICAttr; buf: Ptr; size: longint): ICError;
  153.     begin
  154.         ICCISetPref := ICRSetPref(globals^^.inst, key, attr, buf, size);
  155.     end; (* ICCISetPref *)
  156.  
  157.     function ICCICountPref (globals: globalsHandle; var count: longint): ICError;
  158.     begin
  159.         ICCICountPref := ICRCountPref(globals^^.inst, count);
  160.     end; (* ICCICountPref*)
  161.  
  162.     function ICCIGetIndPref (globals: globalsHandle; n: longint; var key: Str255): ICError;
  163.     begin
  164.         ICCIGetIndPref := ICRGetIndPref(globals^^.inst, n, key);
  165.     end; (* ICCIGetIndPref *)
  166.  
  167.     function ICCIDeletePref (globals: globalsHandle; key: Str255): ICError;
  168.     begin
  169.         ICCIDeletePref := ICRDeletePref(globals^^.inst, key);
  170.     end; (* ICCIDeletePref *)
  171.     
  172.     function ICCIEnd (globals: globalsHandle): ICError;
  173.     begin
  174.         ICCIEnd := ICREnd(globals^^.inst);
  175.     end; (* ICCIEnd *)
  176.  
  177.     function ICCIDefaultFile (globals: globalsHandle; var name: Str63): ICError;
  178.         var
  179.             err: ICError;
  180.             junk: ICError;
  181.             refnum: integer;
  182.             strh: StringHandle;
  183.     begin
  184.         err := noErr;
  185.         name := ICdefault_file_name;
  186.         refnum := OpenComponentResFile(Component(globals^^.self));
  187.         if refnum <= 0 then begin
  188.             err := resNotFound;
  189.         end; (* if *)
  190.         if err = noErr then begin
  191.             strh := GetString(ICdefault_file_name_ID);
  192.             if strh = nil then begin
  193.                 err := resNotFound;
  194.             end
  195.             else begin
  196.                 name := strh^^;
  197.             end; (* if *)
  198.             junk := CloseComponentResFile(refnum);
  199.         end; (* if *)
  200.         ICCIDefaultFile := err;
  201.     end; (* ICCIDefaultFile *)
  202.  
  203.     function Main (var params: ComponentParameters; storage: Handle): ComponentResult;
  204.     (* Component entry point.  It's pretty neat IMHO. *)
  205.         var
  206.             proc: ProcPtr;
  207.             s: signedByte;
  208.     begin
  209.         proc := nil;
  210.         case params.what of
  211.             (* Component Manager stuff *)
  212.             kComponentVersionSelect: 
  213.                 Main := internetConfigurationComponentInterfaceVersion;
  214.             kComponentCanDoSelect: 
  215.                 proc := @ICCICanDo;
  216.             kComponentOpenSelect: 
  217.                 proc := @ICCIOpen;
  218.             (* Component Manager stuff *)
  219.             kComponentCloseSelect: 
  220.                 proc := @ICCIClose;
  221.             kComponentTargetSelect: 
  222.                 proc := @ICCITarget;
  223.             (* this component type stuff *)
  224.             kICCStart: 
  225.                 proc := @ICCIStart;
  226.             kICCStop: 
  227.                 proc := @ICCIStop;
  228.             kICCFindConfigFile: 
  229.                 proc := @ICCIFindConfigFile;
  230.             kICCSpecifyConfigFile: 
  231.                 proc := @ICCISpecifyConfigFile;
  232.             kICCGetSeed: 
  233.                 proc := @ICCIGetSeed;
  234.             kICCGetPerm:
  235.                 proc := @ICCIGetPerm;
  236.             kICCBegin: 
  237.                 proc := @ICCIBegin;
  238.             kICCGetPref: 
  239.                 proc := @ICCIGetPref;
  240.             kICCSetPref: 
  241.                 proc := @ICCISetPref;
  242.             kICCCountPref: 
  243.                 proc := @ICCICountPref;
  244.             kICCGetIndPref: 
  245.                 proc := @ICCIGetIndPref;
  246.             kICCDeletePref:
  247.                 proc := @ICCIDeletePref;
  248.             kICCEnd: 
  249.                 proc := @ICCIEnd;
  250.             kICCDefaultFile: 
  251.                 proc := @ICCIDefaultFile;
  252.             otherwise
  253.                 Main := badComponentSelector;
  254.         end; (* case *)
  255.         if proc <> nil then begin
  256.             if storage <> nil then begin
  257.                 s := HGetState(storage);
  258.                 HLock(storage);
  259.             end; (* if *)
  260.             Main := CallComponentFunctionWithStorage(storage, params, proc);
  261.             if storage <> nil then begin
  262.                 HSetState(storage, s);
  263.             end; (* if *)
  264.         end; (* if *)
  265.     end; (* Main *)
  266.  
  267. end. (* ICComponent *)